6.1 任务描述
前置任务:C4-005
业务模块:数据库
使用SQLiteOpenHelper。
任务类型:按步骤操作
6.2 详细实现步骤
为方便对数据进行操作,数据库操作使用了SQLiteOpenHelper。首先从SQLiteOpenHelper派生了DatabaseHelpler类,然后重写了该类的OnCreate()方法和onUpgrade()方法。在OnCrete()方法中创建数据库中的各表,在onUpgrade()中删除旧表,然后调用OnCreate()再次创建新表。
首先生成DatabaseHelper类,如下所示:
图 17 生成DatabaseHelper类
然后为该类添加重载方法。在类名上单击右键,依次选择菜单“generate…”、“Overide methods…”,也可以依次单击菜单“Code”、““Overide methods…”,Android Studio弹出“Select Methods to Override。Implement”对话框,如下所示。
图 18 实现方法
同上类似,再次在类名上单击右键,依次选择菜单“generate…”、“Constructor”,生成构造函数,为该类添加构造函数。
图 19 构建函数
然后修改代码如下:
package cn.edu.bistu.cs.se.accountbook;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* Created by hbs on 2017-11-27.
*/
public class DatabaseHelpler extends SQLiteOpenHelper {
public static final String DATABASE_NAME="myDatabase";
public static final int DATABASE_VERSION=5;
//支出类型表
private static final String CREATE_TABLE_EXPENDITURE_TYPE="CREATE TABLE " + ExpenditureType.TableAttr.TABLE_NAME + " (" +
ExpenditureType.TableAttr._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
ExpenditureType.TableAttr.COLUMN_TYPE_NAME + " TEXT" + "," +
ExpenditureType.TableAttr.COLUMN_NOTE + " TEXT" + " )";
//支出表
private static final String CREATE_TABLE_EXPENDITURE="CREATE TABLE " + Expenditure.TableAttr.TABLE_NAME + " (" +
Expenditure.TableAttr._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
Expenditure.TableAttr.COLUMN_ACCOUNT_DATE + " TEXT" + "," +
Expenditure.TableAttr.COLUMN_FK_TYPE + " INTEGER" + "," +
Expenditure.TableAttr.COLUMN_AMOUNT + " INTEGER" + " )";
//收入类型表
private static final String CREATE_TABLE_EARNING_TYPE="CREATE TABLE " + EarningType.TableAttr.TABLE_NAME + " (" +
EarningType.TableAttr._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
EarningType.TableAttr.COLUMN_TYPE_NAME + " TEXT" + "," +
EarningType.TableAttr.COLUMN_NOTE + " TEXT" + " )";
//收入表
private static final String CREATE_TABLE_EARNING="CREATE TABLE " + Earning.TableAttr.TABLE_NAME + " (" +
Earning.TableAttr._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
Earning.TableAttr.COLUMN_ACCOUNT_DATE + " TEXT" + "," +
Earning.TableAttr.COLUMN_FK_TYPE + " INTEGER" + "," +
Earning.TableAttr.COLUMN_AMOUNT + " INTEGER" + " )";
//删除支出类型表
private final static String DELETE_TABLE_EXPENDITURE_TYPE = "DROP TABLE IF EXISTS " + ExpenditureType.TableAttr.TABLE_NAME;
//删除支出表
private final static String DELETE_TABLE_EXPENDITURE = "DROP TABLE IF EXISTS " + Expenditure.TableAttr.TABLE_NAME;
//删除s收入类型表
private final static String DELETE_TABLE_EARNING_TYPE = "DROP TABLE IF EXISTS " + EarningType.TableAttr.TABLE_NAME;
//删除收入表
private final static String DELETE_TABLE_EARNING = "DROP TABLE IF EXISTS " + Earning.TableAttr.TABLE_NAME;
public DatabaseHelpler(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
public DatabaseHelpler(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(CREATE_TABLE_EXPENDITURE_TYPE);
sqLiteDatabase.execSQL(CREATE_TABLE_EXPENDITURE);
sqLiteDatabase.execSQL(CREATE_TABLE_EARNING_TYPE);
sqLiteDatabase.execSQL(CREATE_TABLE_EARNING);
//初始化
sqLiteDatabase.execSQL(EarningType.TableAttr.SQL_Init);
sqLiteDatabase.execSQL(ExpenditureType.TableAttr.SQL_Init);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
//当数据库升级时被调用,首先删除旧表,然后调用OnCreate()创建新表
sqLiteDatabase.execSQL(DELETE_TABLE_EXPENDITURE);
sqLiteDatabase.execSQL(DELETE_TABLE_EXPENDITURE_TYPE);
sqLiteDatabase.execSQL(DELETE_TABLE_EARNING_TYPE);
sqLiteDatabase.execSQL(DELETE_TABLE_EARNING);
onCreate(sqLiteDatabase);
}
}